<?php


namespace app\index\controller;
use app\BaseController;

//本控制器用于测试操作数据库-链式操作
class Table extends BaseController
{
    //database.php配置中可以配置各种数据库
    //type	    数据库
    //mysql	    MySQL
    //sqlite	SqLite
    //pgsql	    PostgreSQL
    //sqlsrv	SqlServer
    //mongo	    MongoDb
    //oracle	Oracle
    public function index()
    {
        //连贯操作	    作用	                            支持的参数类型
        //where*	    用于AND查询	                    字符串、数组和对象
        //whereOr*	    用于OR查询	                    字符串、数组和对象
        //whereTime*	用于时间日期的快捷查询	            字符串
        //table	        用于定义要操作的数据表名称	        字符串和数组
        //alias	        用于给当前数据表定义别名	        字符串
        //field*	    用于定义要查询的字段（支持字段排除）	字符串和数组
        //order*	    用于对结果排序	                    字符串和数组
        //limit	        用于限制查询结果数量	            字符串和数字
        //page	        用于查询分页（内部会转换成limit）	字符串和数字
        //group	        用于对查询的group支持	            字符串
        //having	    用于对查询的having支持          	字符串
        //join*	        用于对查询的join支持	            字符串和数组
        //union*	    用于对查询的union支持	            字符串、数组和对象
        //view*	        用于视图查询	                    字符串、数组
        //distinct	    用于查询的distinct支持	            布尔值
        //lock	        用于数据库的锁机制	                布尔值
        //cache	        用于查询缓存	                    支持多个参数
        //with*	        用于关联预载入	                    字符串、数组
        //bind*	        用于数据绑定操作	                数组或多个参数
        //comment	    用于SQL注释	                    字符串
        //force	        用于数据集的强制索引	            字符串
        //master	    用于设置主服务器读取数据	        布尔值
        //strict	    用于设置是否严格检测字段名是否存在	布尔值
        //sequence	    用于设置Pgsql的自增序列名	        字符串
        //failException	用于设置没有查询到数据是否抛出异常	布尔值
        //partition	    用于设置分区信息	                数组 字符串
        //replace	    用于设置使用REPLACE方式写入	        布尔值
        //extra	        用于设置额外查询规则	            字符串
        //duplicate	    用于设置DUPLCATE信息	            数组 字符串
        //所有的连贯操作都返回当前的模型实例对象（this），其中带*标识的表示支持多次调用。

        //##########聚合操作
        //方法	说明
        //count	统计数量，参数是要统计的字段名（可选）
        //max	获取最大值，参数是要统计的字段名（必须）
        //min	获取最小值，参数是要统计的字段名（必须）
        //avg	获取平均值，参数是要统计的字段名（必须）
        //sum	获取总分，参数是要统计的字段名（必须）

        //如果你要获取的最大值不是一个数值，可以使用第二个参数关闭强制转换
        //Db::table('think_user')->max('name',false);

        //获取积分大于0的用户的最小积分：
        //Db::table('think_user')->where('score', '>', 0)->min('score');

        //和max方法一样，min也支持第二个参数用法
        //Db::table('think_user')->where('score', '>', 0)->min('name',false);

        //获取用户的平均积分：
        //Db::table('think_user')->avg('score');

        //生成的SQL语句是：
        //SELECT AVG(score) AS tp_avg FROM `think_user` LIMIT 1

        //统计用户的总成绩：
        //Db::table('think_user')->where('id',10)->sum('score');

        //生成的SQL语句是：
        //SELECT SUM(score) AS tp_sum FROM `think_user` LIMIT 1

        //如果你要使用group进行聚合查询，需要自己实现查询，例如：
        //Db::table('score')->field('user_id,SUM(score) AS sum_score')->group('user_id')->select();

        //##########分页查询
        // 查询状态为1的用户数据 并且每页显示10条数据
        //$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10);
        // 渲染模板输出
        //return view('index', ['list' => $list]);
        // 渲染代码
        //<ul>
        //{volist name='list' id='user'}
        //    <li> {$user.nickname}</li>
        //{/volist}
        //</ul>
        //{$list|raw}

        //单独赋值分页变量
        // 获取分页显示
        //$page = $list->render();
        //return view('index', ['list' => $list, 'page' => $page]);

        //默认分页样式
        //<ul class="pagination">
        //<li><a href="?page=1">&laquo;</a></li>
        //<li><a href="?page=1">1</a></li>
        //<li class="active"><span>2</span></li>
        //<li class="disabled"><span>&raquo;</span></li>
        //</ul>

        //分页后的数据处理
        //$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){
        //    $item['nickname'] = 'think';
        //    return $item; //查询构造器的方式需要设置返回值
        //});
        //如果是通过模型操作则不需要返回值
        //$list = User::where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){
        //    $item->nickname = 'think';
        //});

        //简单分页（仅有上一页下一页）
        //paginate(10, true)
        //样式
        //<ul class="pager">
        //<li><a href="?page=1">&laquo;</a></li>
        //<li class="disabled"><span>&raquo;</span></li>
        //</ul>

        //分页参数
        //参数	    描述
        //list_rows	每页数量
        //page	    当前页
        //path	    url路径
        //query	    url额外参数
        //fragment	url锚点
        //var_page	分页变量
        //$list = Db::name('user')->where('status',1)->paginate([
        //    'list_rows'=> 20,
        //    'var_page' => 'page',
        //]);

        //##########时间查询

        //时间比较 whereTime
        //// 大于某个时间
        //Db::name('user')
        //    ->whereTime('birthday', '>=', '1970-10-1')
        //    ->select();
        //// 小于某个时间
        //Db::name('user')
        //    ->whereTime('birthday', '<', '2000-10-1')
        //    ->select();
        //// 时间区间查询
        //Db::name('user')
        //    ->whereTime('birthday', 'between', ['1970-10-1', '2000-10-1'])
        //    ->select();
        //// 不在某个时间区间
        //Db::name('user')
        //    ->whereTime('birthday', 'not between', ['1970-10-1', '2000-10-1'])
        //    ->select();
        //// 查询两个小时内的博客
        //Db::name('blog')
        //	->whereTime('create_time','-2 hours')
        //    ->select();

        //区间查询 whereBetweenTime/whereNotBetweenTime
        //// 查询2017年上半年注册的用户
        //Db::name('user')
        //    ->whereBetweenTime('create_time', '2017-01-01', '2017-06-30')
        //    ->select();
        //
        //// 查询不是2017年上半年注册的用户
        //Db::name('user')
        //    ->whereNotBetweenTime('create_time', '2017-01-01', '2017-06-30')
        //    ->select();

        //按年查询 whereYear
        //// 查询2018年注册的用户
        //Db::name('user')
        //    ->whereYear('create_time', '2018')
        //    ->select();
        //// 查询今年注册的用户
        //Db::name('user')
        //    ->whereYear('create_time')
        //    ->select();
        //// 查询去年注册的用户
        //Db::name('user')
        //    ->whereYear('create_time', 'last year')
        //    ->select();

        //按月查询 whereMonth
        //查询本月注册的用户
        //Db::name('user')
        //    ->whereMonth('create_time')
        //    ->select();
        //查询上月注册用户
        //Db::name('user')
        //    ->whereMonth('create_time','last month')
        //    ->select();
        //查询2018年6月注册的用户
        //Db::name('user')
        //    ->whereMonth('create_time', '2018-06')
        //    ->select();

        //按周查询 whereWeek
        //查询本周数据
        //Db::name('user')
        //    ->whereWeek('create_time')
        //    ->select();
        //查询上周数据
        //Db::name('user')
        //    ->whereWeek('create_time', 'last week')
        //    ->select();
        //查询指定某天开始的一周数据
        //// 查询2019-1-1到2019-1-7的注册用户
        //Db::name('user')
        //    ->whereWeek('create_time', '2019-1-1')
        //    ->select();

        //按天查询 whereDay
        //查询当天注册的用户
        //Db::name('user')
        //    ->whereDay('create_time')
        //    ->select();
        //查询昨天注册的用户
        //Db::name('user')
        //    ->whereDay('create_time', 'yesterday')
        //    ->select();
        //查询某天的数据使用
        //// 查询2018年6月1日注册的用户
        //Db::name('user')
        //    ->whereDay('create_time', '2018-06-01')
        //    ->select();

        //##########高级查询
        //#####快捷查询
        //Db::table('think_user')
        //    ->where('name|title','like','thinkphp%')
        //    ->where('create_time&update_time','>',0)
        //    ->find();

        //#####数组方式如果使用exp查询的话，一定要用raw方法。
        //Db::table('think_user')
        //    ->where([
        //        ['name', 'like', 'thinkphp%'],
        //        ['title', 'like', '%thinkphp'],
        //        ['id', 'exp', Db::raw('>score')],
        //        ['status', '=', 1],
        //    ])
        //    ->select();

        //$map = [
        //        ['name', 'like', 'thinkphp%'],
        //        ['title', 'like', '%thinkphp'],
        //        ['id', '>', 0],
        //    ];
        //Db::table('think_user')
        //    ->where([ $map ])
        //    ->where('status',1)
        //    ->select();

        //#####闭包查询
        //$name = 'thinkphp';
        //$id = 10;
        //Db::table('think_user')->where(function ($query) use($name, $id) {
        //    $query->where('name', $name)
        //        ->whereOr('id', '>', $id);
        //})->select();

        //#####原生查询
        //对于一些实在复杂的查询，也可以直接使用原生SQL语句进行查询，例如：
        //Db::table('think_user')
        //    ->whereRaw('id > 0 AND name LIKE "thinkphp%"')
        //    ->select();
        //为了安全起见，我们可以对字符串查询条件使用参数绑定，例如：
        //Db::table('think_user')
        //    ->whereRaw('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
        //    ->select();

        //#####快捷方法
        //方法	            作用
        //whereOr	        字段OR查询
        //whereXor	        字段XOR查询
        //whereNull	        查询字段是否为Null
        //whereNotNull	    查询字段是否不为Null
        //whereIn	        字段IN查询
        //whereNotIn	    字段NOT IN查询
        //whereBetween	    字段BETWEEN查询
        //whereNotBetween	字段NOT BETWEEN查询
        //whereLike	        字段LIKE查询
        //whereNotLike	    字段NOT LIKE查询
        //whereExists	    EXISTS条件查询
        //whereNotExists	NOT EXISTS条件查询
        //whereExp	        表达式查询
        //whereColumn	    比较两个字段
        //---查询update_time大于create_time的用户数据
        //Db::table('think_user')
        //    ->whereColumn('update_time','>','create_time')
        //    ->select();
        //生成的SQL语句是：
        //SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` )

        //---查询name和nickname相同的用户数据
        //Db::table('think_user')
        //    ->whereColumn('name','=','nickname')
        //    ->select();
        //生成的SQL语句是：
        //SELECT * FROM `think_user` WHERE ( `name` = `nickname` )
        //相同字段条件也可以简化为
        //Db::table('think_user')
        //    ->whereColumn('name','nickname')
        //    ->select();

        //---支持数组方式比较多个字段
        //Db::name('user')->whereColumn([
        //	['title', '=', 'name'],
        //    ['update_time', '>=', 'create_time'],
        //])->select();
        //生成的SQL语句是：
        //SELECT * FROM `think_user` WHERE ( `name` = `nickname` AND `update_time` > `create_time` )

        //#####动态查询
        //方法	                描述
        //whereFieldName	    查询某个字段的值
        //whereOrFieldName	    查询某个字段的值
        //getByFieldName	    根据某个字段查询（只返回一条数据）
        //getFieldByFieldName	根据某个字段获取某个值（只返回一条数据）
        //// 根据邮箱（email）查询用户信息
        //$user = Db::table('user')
        //	->whereEmail('thinkphp@qq.com')
        //    ->find();
        //
        //// 根据昵称（nick_name）查询用户
        //$email = Db::table('user')
        //    ->whereNickName('like', '%流年%')
        //    ->select();
        //
        //// 根据邮箱查询用户信息
        //$user = Db::table('user')
        //    ->getByEmail('thinkphp@qq.com');
        //
        //// 根据昵称（nick_name）查询用户信息
        //$user = Db::table('user')
        //    ->field('id,name,nick_name,email')
        //    ->getByNickName('流年');
        //
        //// 根据邮箱查询用户的昵称
        //$nickname = Db::table('user')
        //    ->getFieldByEmail('thinkphp@qq.com', 'nick_name');
        //
        //// 根据昵称（nick_name）查询用户邮箱
        //$email = Db::table('user')
        //    ->getFieldByNickName('流年', 'email');

        //##########视图查询（多表查询推荐，不依赖数据库视图，注意表会自动加前缀）
        //Db::view('User', 'id,name')
        //    ->view('Profile', 'truename,phone,email', 'Profile.user_id=User.id')
        //    ->view('Score', 'score', 'Score.user_id=Profile.id')
        //    ->where('score', '>', 80)
        //    ->select();
        //生成的SQL语句类似于：
        //SELECT User.id,User.name,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user User INNER JOIN think_profile Profile ON Profile.user_id=User.id

        //默认使用INNER join查询，如果需要更改，可以使用：
        //Db::view('User', 'id,name')
        //    ->view('Profile', 'truename,phone,email', 'Profile.user_id=User.id', 'LEFT') //LEFT JOIN
        //    ->view('Score', 'score', 'Score.user_id=Profile.id', 'RIGHT') //RIGHT JOIN
        //    ->where('score', '>', 80)
        //    ->select();

        //可以使用数组的方式定义表名以及别名，例如：
        //Db::view(['think_user' => 'member'], ['id' => 'uid', 'name' => 'account'])
        //    ->view('Profile', 'truename,phone,email', 'Profile.user_id=member.id')
        //    ->view('Score', 'score', 'Score.user_id=Profile.id')
        //    ->where('score', '>', 80)
        //    ->select();

        //##########JSON字段（某字段使用json格式或类型时可以采用）
        //插入json数据
        //$user['name'] = 'thinkphp';
        //$user['info'] = [
        //	'email'    => 'thinkphp@qq.com',
        //	'nickname' => '流年',
        //];
        //Db::name('user')
        //	->json(['info']) //这里代表的是表字段而不是数组
        //	->insert($user);

        //查询整个JSON数据：
        //$user = Db::name('user')
        //	->json(['info'])
        //	->find(1);
        //dump($user);

        //查询条件为JSON数据
        //$user = Db::name('user')
        //	->json(['info'])
        //    ->where('info->nickname','ThinkPHP')
        //	->find();
        //dump($user);

        //由于JSON字段的属性类型并不会自动获取，所以，如果是整型数据查询的话，可以设置JSON字段类型，例如：
        //$user = Db::name('user')
        //	->json(['info'])
        //    ->where('info->user_id', 10)
        //	->setFieldType(['info->user_id' => 'int'])
        //	->find();
        //dump($user);

        //完整JSON数据更新
        //$data['info'] = [
        //	'email'    => 'kancloud@qq.com',
        //	'nickname' => 'kancloud',
        //];
        //Db::name('user')
        //	->json(['info'])
        //    ->where('id',1)
        //	->update($data);

        //单个JSON数据更新
        //$data['info->nickname'] = 'ThinkPHP';
        //Db::name('user')
        //	->json(['info'])
        //    ->where('id',1)
        //	->update($data);

        //##########子查询
        //获取sql语句
        //$subQuery = Db::table('think_user')
        //    ->field('id,name')
        //    ->where('id', '>', 10)
        //    ->fetchSql(true)
        //    ->select();
        //生成的subQuery结果为：
        //SELECT `id`,`name` FROM `think_user` WHERE `id` > 10

        //$subQuery = Db::table('think_user')
        //    ->field('id,name')
        //    ->where('id', '>', 10)
        //    ->buildSql(); //这个会在语句两边加上括号，推荐用这个
        //生成的subQuery结果为：
        //( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )

        //通过生成的sql构造子查询
        //Db::table($subQuery . ' a')
        //    ->where('a.name', 'like', 'thinkphp')
        //    ->order('id', 'desc')
        //    ->select();
        //生成的SQL语句为：
        //SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc

        //使用闭包构造子查询
        //IN/NOT IN和EXISTS/NOT EXISTS之类的查询可以直接使用闭包作为子查询，例如：
        //Db::table('think_user')
        //    ->where('id', 'IN', function ($query) {
        //        $query->table('think_profile')->where('status', 1)->field('id');
        //    })
        //    ->select();
        //生成的SQL语句是（查出所有状态为1的档案id，然后查询哪些用户id存在于这些档案id）
        //SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )

        //########## 原生查询
        //##### query方法（query方法用于执行SQL查询操作，返回查询结果数据集（数组）。）
        //Db::query("select * from think_user where status=:id", ['id' => 1]);
        //如果希望从主库读取，可以使用
        //Db::query("select * from think_user where status=:id", ['id' => 1], true);

        //##### execute方法（execute用于更新和写入数据的sql操作，如果数据非法或者查询错误则返回false，否则返回影响的记录数。）
        //Db::execute("update think_user set name='thinkphp' where status=1");

        //##### 占位符（参数绑定）
        //Db::query("select * from think_user where id=? AND status=?", [8, 1]);
        // 命名绑定
        //Db::execute("update think_user set name=:name where status=:status", ['name' => 'thinkphp', 'status' => 1]);


        //##########获取查询参数
        //有时候我们的查询条件是不固定的,这时候我们可以通过getOptions()获取最终的查询条件.
        //这样我们可以很方便的对这次查询生成一次单独的缓存.
        //$model_list = User::order();
        //if (!empty($create_time)) {
        //    $model_list->where('create_time', '>',$create_time);
        //}
        //$options = $model_list->getOptions();
        //$list = $model_list->select();

        //返回options的数据类似:
        //{
        //	"json": [],
        //	"json_assoc": false,
        //	"field_type": [],
        //	"soft_delete": ["__TABLE__.delete_time", ["=", 0]],
        //	"where": {
        //		"AND": [
        //			["sass_uid", "=", "61011ed0c9610"],
        //			["hold_time", ">=", 1630252800, null],
        //			["hold_time", "<=", 1630339199, null],
        //			["custom_status", "=", 0]
        //		]
        //	}
        //}



    }



}